#pragma once
#include "cross-stdarg.h"
#include "EventLoop.hpp"

// 将线程与EventLoop对应起来
class LoopThread
{
private:
	// 实例化EventLoop对象，唤醒有可能阻塞在_cond上的线程，并且启动loop
	void ThreadEntry()
	{
		EventLoop loop;
		{
			std::unique_lock<std::mutex> lock(_mutex);
			_loop = &loop;
			_cond.notify_all();
		}
		loop.Start();
	}

public:
	// 创建线程，设置线程入口函数
	LoopThread()
		: _loop(nullptr), _thread(std::thread(&LoopThread::ThreadEntry, this))
	{
	}
	// 返回当前线程对应的EventLoop指针
	EventLoop *GetLoop()
	{
		EventLoop *loop = nullptr;
		{
			std::unique_lock<std::mutex> lock(_mutex); // 加锁
			_cond.wait(lock, [&]()
					   { return _loop != nullptr; }); // 如果为nullptr就一直阻塞
			loop = _loop;
		}
		return loop;
	}

private:
	std::mutex _mutex;			   // 互斥锁
	std::condition_variable _cond; // 条件变量
	EventLoop *_loop;			   // EventLoop指针变量，需要在线程中实例化
	std::thread _thread;		   // EventLoop对应的线程
};